package uniquindio.facing.ingesis.moviles.undroiq.activity;

import java.util.ArrayList;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.facebook.android.AsyncFacebookRunner;
import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.Facebook.DialogListener;
import com.facebook.android.FacebookError;

import uniquindio.facing.ingesis.moviles.undroiq.contantes.ConstantesGenerales;
import uniquindio.facing.ingesis.moviles.undroiq.http.Httppostaux;
import uniquindio.facing.ingesis.moviles.undroiq.utilitarios.Utils;
import uniquindio.facing.ingesis.moviles.undroiq.utilitarios.Validacion;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

public class LoginActiviy extends Activity {

	// Your Facebook APP ID
	private static String APP_ID = "371727279587166"; // Replace your App ID
														// here

	// Instance of Facebook Class
	private Facebook facebook;
	private AsyncFacebookRunner mAsyncRunner;
	 private SharedPreferences mPrefs;

	private EditText user;
	private EditText pass;

	private ProgressDialog pDialog;
	Httppostaux post;

	// private BinderService binderService;

	private ServiceConnectionForBinder sForBinder = new ServiceConnectionForBinder(
			this);

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_login);
		Log.i(ConstantesGenerales.UNDROIQ, ConstantesGenerales.CREATE
				+ this.getClass().getCanonicalName());
		post = new Httppostaux();
		user = (EditText) findViewById(R.id.proyecto_txt_email);
		pass = (EditText) findViewById(R.id.proyecto_txt_pass);
		facebook = new Facebook(APP_ID);
		mAsyncRunner = new AsyncFacebookRunner(facebook);

	}

	@Override
	protected void onStart() {
		super.onStart();
		Log.i(ConstantesGenerales.UNDROIQ, ConstantesGenerales.START
				+ this.getClass().getCanonicalName());
		Intent intent = new Intent(this, BinderService.class);
		bindService(intent, sForBinder, BIND_AUTO_CREATE);

	}

	@Override
	protected void onStop() {
		super.onStop();
		Log.i(ConstantesGenerales.UNDROIQ, ConstantesGenerales.STOP
				+ this.getClass().getCanonicalName());
		try {
			unbindService(sForBinder);
		} catch (Exception e) {
			e.printStackTrace();
			Log.e(ConstantesGenerales.UNDROIQ, ConstantesGenerales.STOP_ERROR);
		}
	}

	public void onClickLinkToRegister(View view) {
		Log.i(ConstantesGenerales.UNDROIQ, ConstantesGenerales.LINK_REGISTER);

		Intent i = new Intent(LoginActiviy.this, RegistroActivity.class);
		startActivity(i);
	}

	public void onClickLinkToLoginActivity(View view) {

		Log.i(ConstantesGenerales.UNDROIQ, ConstantesGenerales.LINK_LOGIN);

		String usuario = user.getText().toString();
		String passw = pass.getText().toString();

		if (Validacion.validarIngreso(usuario, passw, Validacion.NULO)) {

			if (Validacion.validarCorreo(usuario)) {

				new asynclogin().execute(usuario, passw);

			} else {
				Validacion.err_email(this);
			}
		} else {
			Validacion.err_empy(this);
		}

	}
	
	public void onClickLinkToLoginFacebook(View view) {
		loginToFacebook();
		
	}
	
	
	public void loginToFacebook() {
	    mPrefs = getPreferences(MODE_PRIVATE);
	    String access_token = mPrefs.getString("access_token", null);
	    long expires = mPrefs.getLong("access_expires", 0);
	 
	    if (access_token != null) {
	        facebook.setAccessToken(access_token);
	    }
	 
	    if (expires != 0) {
	        facebook.setAccessExpires(expires);
	    }
	 
	    if (!facebook.isSessionValid()) {
	        facebook.authorize(this,
	                new String[] { "email", "publish_stream" },
	                new DialogListener() {
	 
						public void onCancel() {
	                        // Function to handle cancel event
	                    }
	 
	                    public void onComplete(Bundle values) {
	                        // Function to handle complete event
	                        // Edit Preferences and update facebook acess_token
	                        SharedPreferences.Editor editor = mPrefs.edit();
	                        editor.putString("access_token",
	                                facebook.getAccessToken());
	                        editor.putLong("access_expires",
	                                facebook.getAccessExpires());
	                        editor.commit();
	                        
	                        Intent intent = new Intent(LoginActiviy.this,
	        						PestanasActivity.class);
	        				//intent.putExtra(ConstantesGenerales.EMAIL, email);
	        				startActivity(intent);
	                    }
	 
	                    public void onError(DialogError error) {
	                        // Function to handle error
	 
	                    }
	 
	                    public void onFacebookError(FacebookError fberror) {
	                        // Function to handle Facebook errors
	 
	                    }
	 
	                });
	    }
	}

	// public void setBinderService(BinderService binderService) {
	// this.binderService = binderService;
	// }

	/*
	 * Valida el estado del logueo solamente necesita como parametros el usuario
	 * y passw
	 */
	public boolean loginstatus(String email, String password) {
		int logstatus = -1;

		ArrayList<NameValuePair> postparameters2send = new ArrayList<NameValuePair>();

		postparameters2send.add(new BasicNameValuePair(
				ConstantesGenerales.EMAIL, email));
		postparameters2send.add(new BasicNameValuePair(
				ConstantesGenerales.PASSWORD, password));

		// realizamos una peticion y como respuesta obtenes un array JSON
		JSONArray jdata = post.getserverdata(postparameters2send,
				ConstantesGenerales.URL_CONNECT);

		SystemClock.sleep(950);

		// si lo que obtuvimos no es null
		if (jdata != null && jdata.length() > 0) {

			JSONObject json_data; // creamos un objeto JSON
			try {
				json_data = jdata.getJSONObject(0);

				logstatus = json_data.getInt(ConstantesGenerales.LOGSTATUS);
				Log.e(ConstantesGenerales.UNDROIQ,
						ConstantesGenerales.JSON_STATUS + logstatus);

			} catch (JSONException e) {
				e.printStackTrace();
			}

			// validamos el valor obtenido
			if (logstatus == 0) {
				Log.e(ConstantesGenerales.UNDROIQ,
						ConstantesGenerales.LOGIN_INVALIDO);
				return false;
			} else {
				Log.i(ConstantesGenerales.UNDROIQ,
						ConstantesGenerales.LOGIN_VALIDO);
				return true;
			}

		} else {
			Log.e(ConstantesGenerales.UNDROIQ, ConstantesGenerales.JSON_ERROR);
			return false;
		}

	}

	/*
	 * CLASE ASYNCTASK
	 * 
	 * usaremos esta para poder mostrar el dialogo de progreso mientras enviamos
	 * y obtenemos los datos podria hacerse lo mismo sin usar esto pero si el
	 * tiempo de respuesta es demasiado lo que podria ocurrir si la conexion es
	 * lenta o el servidor tarda en responder la aplicacion sera inestable.
	 * ademas observariamos el mensaje de que la app no responde.
	 */

	class asynclogin extends AsyncTask<String, String, String> {

		String email, pass;

		protected void onPreExecute() {
			// para el progress dialog
			pDialog = new ProgressDialog(LoginActiviy.this);
			pDialog.setMessage(ConstantesGenerales.MENSAJE_AUTENTICAR);
			pDialog.setIndeterminate(false);
			pDialog.setCancelable(false);
			pDialog.show();
		}

		protected String doInBackground(String... params) {
			email = params[0];
			pass = params[1];

			Log.e(ConstantesGenerales.UNDROIQ, ConstantesGenerales.DATOS
					+ email + pass);

			if (loginstatus(email, pass) == true) {
				return ConstantesGenerales.OK;
			} else {
				return ConstantesGenerales.ERR;
			}

		}

		/*
		 * Una vez terminado doInBackground segun lo que halla ocurrido pasamos
		 * a la sig. activity o mostramos error
		 */
		protected void onPostExecute(String result) {

			pDialog.dismiss();// ocultamos progess dialog.
			Log.e(ConstantesGenerales.UNDROIQ, ConstantesGenerales.POSTEXECUTE
					+ result);

			if (result.equals(ConstantesGenerales.OK)) {

				Intent intent = new Intent(LoginActiviy.this,
						PestanasActivity.class);
				intent.putExtra(ConstantesGenerales.EMAIL, email);
				startActivity(intent);

			} else {
				Validacion.err_login(LoginActiviy.this);
			}

		}

	}

}
